/**
 * mongodb驱动封装
 */
// 一些个人封装的公共脚本可以在项目根目录下新建common、utils文件夹。

// 引题：
// 每一个数据库操作都 require mongodb client connect client.db() db.collection 
// 太重复，数据库连接和切换数据库、关闭 这些公共操作应该封装。
// 百度'express middleware mongodb'没有发现合适的中间件，那么自己封装
// 常量：const ，constant variable 不变的变量，初始化时即确定值，
//      如果后面尝试改变值就会报错。 适合写选项、配置。  
// 配置的变量习惯上全大写。
var mongodb = require('mongodb');

// 数据库配置
const URI = 'mongodb://127.0.0.1:27017';
const DATABASE = 'studentsManage';

var MongoClient = mongodb.MongoClient;
module.exports.crud = function crud(callback){
    // 把连接数据库、切换库、关闭连接这些公共功能抽象出来。函数嵌套。
    // 封装大概思路，把公共逻辑放外层crud函数中，把业务逻辑让回调callback函数中执行
    MongoClient.connect(URI, { useUnifiedTopology: true }, function(err, client){
        if (err) throw err;
        var db = client.db(DATABASE);    // 如果库不存在会自动创建。
        // 把db对象交给回调函数，回调函数中可以写业务逻辑。 
        callback(db);
        // 回调函数执行完后关闭数据库连接
        client.close();
    })
}

// function callback(db){
//     db.collection.insertOne()
// }

// 单脚本测试
// crud(function(db){
//     db.collection('test').insertOne({test:'测试mongoUtil'}, function(err, result){
//         if (err) throw err;
//         console.log('应该成功了，检查下数据库数据');
//     })
// });

// 其它地方使用
// {crud: function crud(){}}
// var crud = require('mongoUtil.js')
// curd(function(db){  db.collection('test').insertOne() })

// 可能由于express框架加载脚本顺序的影响，直接这样写 routes/students.js 
// 导入对象的crud属性为空。  
// 只能写成 modules.exports.crud = function(){}  把逻辑直接导出。
// module.exports = crud;  
// module.exports.crud = curd;
// module.exports = {
//     curd: curd,
// }    


